從複雜物件的佈局中抽出生成程序,以便用同一個生成程序製造各種不同的物件佈局
最簡單的生成器(Builder)架構,甚至不需要抽象介面,也可以完成
class CatBuilder
def self.build
builder = new
yield(builder)
builder.cat
end
def initialize
@cat = Cat.new
end
def set_name(name)
@cat.name = name
end
def set_birthday(birthday)
@cat.birthday = Time.new(birthday)
end
def set_as_male
@cat.gender = 'm'
end
def set_as_female
@cat.gender = 'f'
end
def set_color(color)
@cat.color = color
end
def cat
@cat
end
end
class Cat
attr_accessor :name, :birthday, :gender, :color
def characteristic
puts "name: #{name}, birthday: #{birthday}, gender: #{gender}, color: #{color}"
end
end
cat = CatBuilder.build do |builder|
builder.set_name("歐魯")
builder.set_birthday("2021-1-1")
builder.set_as_female
builder.set_color("玳瑁")
end
cat.characteristic
name: 歐魯, birthday: 2021-01-01 00:00:00 +0800, gender: f, color: 玳瑁
之所以結構圖內出現的Builder,是因為因需求而創造不同的產品
例如今天如果多一個class Dog
時,就會多增加一個DogBuilder
來繼承Builder
介面
此外還有可以增加Director
來決定建立順序
Director
的功用在於協助建立流程與確保內容
例如產品建立順序為A -> B -> C
那麼這樣的流程邏輯,寫在Director
中
然後在建立產品時,除了一定會有A B C以外,也一定會依照順序產出
Cat
內充滿參數時會是怎樣...Cat.new(name:"歐魯", birthday:"2021-1-1", gender:"f", color:"玳瑁")
Cat
實體與其特徵設定,不會混在一起Director
類別時,可以確保生成程序明天要來開始討論Factory Method囉~ 加油加油
感謝大家 如有問題,再煩請大家指教!